package com.da.javatest.interview.other.cglib;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
 * @author chenlida
 * @date 2020/4/5 14:28
 * @description
 */
public class CglibProxyFactory implements MethodInterceptor {
    /**
     * 代理的目标对象
     */
    private Object targetObject;

    /**
     * 产生一个代理对象
     */
    public Object createProxyInstance(Object targetObject) {
        this.targetObject = targetObject;
        //用于生成代理对象
        Enhancer enhancer = new Enhancer();
        //设置目标类为代理对象的父类
        enhancer.setSuperclass(this.targetObject.getClass());
        //设置回调对象为本身
        enhancer.setCallback(this);
        //生成一个代理类对象
        return enhancer.create();
    }

    @Override
    public Object intercept(Object object, Method method, Object[] arg,
                            MethodProxy methodProxy) throws Throwable {
        //CglibTest cglibTest = (CglibTest)this.targetObject;
        //在代理真实对象方法执行前我们可以添加一些自己的操作
        System.out.println("Before 真实对象方法执行...");
        // 这里methodProxy.invoke()会一直反射生成自己这个类，导致递归一直入栈报错
        Object result = methodProxy.invokeSuper(object, arg);
        System.out.println("反射结果:" + result);
        //在代理真实对象方法执行后我们也可以添加一些自己的操作
        System.out.println("After 真实对象方法执行...");
        return result;
    }
}